package com.aaa.cars.service.impl;

import com.aaa.cars.dao.BaseAreaDao;
import com.aaa.cars.entity.BaseArea;
import com.aaa.cars.entity.ClearAble;
import com.aaa.cars.service.BaseAreaService;
import com.aaa.common.bo.TreeNode;
import com.aaa.common.constants.ExceptionConstant;
import com.aaa.common.constants.ReturnStatus;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.Result;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 统一地区库(省市县区)(BaseArea)表服务实现类
 *
 * @author makejava
 * @since 2020-12-04 19:25:47
 */
@Service("baseAreaService")
@Transactional
public class BaseAreaServiceImpl implements BaseAreaService {
    @Autowired
    private BaseAreaDao baseAreaDao;

    /**
     *
     * @return
     */
    @Override
    public BaseArea queryById(Long baseAreaid) {
        return this.baseAreaDao.queryById(baseAreaid);
    }

    /**
     * 通过实体作为筛选条件查询
     *
     * @param pageNo
     * @param pageSize
     * @param baseArea 实例对象
     * @return 对象列表
     */
    @Override
    public Result queryAll(int pageNo, int pageSize, BaseArea baseArea) {
        if(pageNo==0||pageSize==0){
            throw new CustomException(ExceptionConstant.INVALID_ARGUMENT.getErrorCode(),
                    ExceptionConstant.INVALID_ARGUMENT.getErrorMessage());
        }
        //分页
        PageHelper.startPage(pageNo,pageSize);
        PageInfo<BaseArea> pageInfo = new PageInfo<BaseArea>(baseAreaDao.queryAll(baseArea));

        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg(), pageInfo);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<BaseArea> queryAllByLimit(int offset, int limit) {
        return this.baseAreaDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param baseArea 实例对象
     * @return 实例对象
     */
    @Override
    public BaseArea insert(BaseArea baseArea) {
        this.baseAreaDao.insert(baseArea);
        return baseArea;
    }

    /**
     * 修改数据
     *
     * @param baseArea 实例对象
     * @return 实例对象
     */
    @Override
    public BaseArea update(BaseArea baseArea) {
        this.baseAreaDao.update(baseArea);
        return this.queryById(baseArea.getBaseAreaid());
    }

    /**
     * 通过主键删除数据
     *
     * @param baseAreaid 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long baseAreaid) {
        return this.baseAreaDao.deleteById(baseAreaid) > 0;
    }

    /**
     * 查询省份，城市
     * @param baseArea
     * @return
     */
    @Override
    public Result quallAllBase(BaseArea baseArea) {
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg(),baseAreaDao.queryAll(baseArea));
    }

    /**
     * 门店添加时查询全部
     * @return
     */
    @Override
    public Result queryList() {
        //获取数据集合
        List<TreeNode> treeNodes = baseAreaDao.queryList();
        //定义返回集合
        List<TreeNode> treeNodeList=new ArrayList<>();
        //循环集合，绑定子节点
        if(treeNodes!=null && treeNodes.size()>0){
            for (TreeNode treeNode : treeNodes) {
                if(treeNode.getParentId()==0){
                    treeNodeList.add(treeNode);
                    //绑定子节点
                    bindChildren(treeNode,treeNodes);
                }
            }
        }
        //返回成功
        return new Result(ReturnStatus.SUCCESS.getReturnCode(),
                ReturnStatus.SUCCESS.getReturnMsg(),treeNodeList);
    }

    public void bindChildren(TreeNode currentNode,List<TreeNode> treeNodes){
        //再次循环集合
        for (TreeNode treeNode : treeNodes) {
            //判断循环节点是否是当前节点的孩子，如果是加入
            if(treeNode.getParentId()==currentNode.getId()){
                List<TreeNode> children = currentNode.getChildren();
                //如果是第一个孩子，孩子集合为空，进行实例化
                if(children==null){
                    children=new ArrayList<>();
                }
                //添加孩子
                children.add(treeNode);
                //设置
                currentNode.setChildren(children);
                //递归找当前循环节点的孩子
                bindChildren(treeNode,treeNodes);
            }
        }
    }
}